查看原文
其他

最近群里出现的3个数据处理需求,如何用Pandas简单实现一下

道才 可以叫我才哥 2023-02-06

大家好,我是才哥。

最近咱们交流群还是蛮热的,今天就分享一下这几天交流群里朋友们的一些实际问题的解法。感兴趣的朋友还可以添加才哥好友,回复加群拉你交流群哈~

目录:

  • 问题1:透视与多层索引类

  • 问题2:文本数据处理类

  • 问题3:条件赋值


问题1:透视与多层索引类

有一个朋友,提出了这样的疑问,类似长表变宽表的题,看了下大致需要用到透视和多层索引的处理。

我们来看一下详细需求:

看到这个,我们用Excel其实很好处理,直接 数据透视表 拖拽就行,参考:

Excel直接上透视表

那么,在Pandas里怎么实现呢?

可以看到这位朋友方向是对的,但是在参数设置上稍微有点问题,应该这样实现:

import pandas as pd
# 大家直接复制下面输出的数据然后演示即可
df = pd.read_clipboard()
df

原始数据:


月份编号单价数量
01月A01101
11月A02102
21月A03103
31月A04104
42月A0131
52月A0242
63月A0131
73月A0242
83月A0353
93月A0464
103月A0575
# 透视过程
temp = df.pivot(index='编号',columns='月份',values=['单价','数量'])
temp

输出结果:

这个时候,其实和期望结果还是有点差异,我们期望的是月份下面分单价和数据,而不是单价与数量下面分月份。这个时候,就该我们多层索引出场了,直接调整索引的level即可

# 多层索引调整level
data = temp.swaplevel(0,1,axis=1).sort_index(axis=1)
data

输出结果:

你以为到这里就结束了吗?其实不然!

我们看下输出的excel文档结果,发现存在一行为空的情况,通过查询发现这是Pandas已知的问题,据说是为了给行索引名字(编号)留的。

怎么处理呢?可以试着去掉行索引名字,然后存csv

# 行索引名称去掉
data.index.name=None
data

然后存为csv文件,发现勉强可以:

data.to_csv('结果.csv',encoding='utf-8-sig')

补充:大家还可以用excel处理的其他第三方库操作,比如openpyxl里的delete_rows(3)删除第三行之类的。


问题2:文本数据处理类

有一个朋友有一些数据,看了下内容大致上姓名-号码-单号组成,但是每个元素部分之间的分隔符并不统一。看了下, 大致可以用pandas里的extract来提取。

测试数据大家可以后台回复 955 在答疑解惑文件夹20211113测试数据领取

import pandas as pd

# 读取数据
df = pd.read_excel(r'测试数据.xlsx')
df

测试数据:


信息
0小明-185-DEG30V8
1小一-138-DEGV22
2库里-138-JQCB07
3云朵-130-SHYG202613
4赛文 133 SHYZ20270
5二百君-189-SHYZ2010
6皮特-139-SHYG26236
7萝卜-189-SHYZ22189
8辰哥-156-SHYG29116
9可乐-185-SHYG26663
10才哥-160

这里直接参考《一看就会的Pandas文本数据处理》,用extract函数方法来进行提取。

df['信息'].str.extract(r'(?P<姓名>[\u4e00-\u9fa5]+).*?(?P<号码>\d+).*?(?P<单号>[A-Z].*)?$')

输出结果:


姓名号码单号
0小明185DEG30V8
1小一138DEGV22
2库里138JQCB07
3云朵130SHYG202613
4赛文133SHYZ20270
5二百君189SHYZ2010
6皮特139SHYG26236
7萝卜189SHYZ22189
8辰哥156SHYG29116
9可乐185SHYG26663
10才哥160NaN


问题3:条件赋值

有一个朋友需要修改满足条件的数据帧某个字段的值,然后按照预想的方式发现不奏效!

我们简单看下他是怎么操作的:

那是为什么呢?

其实,在['金额']之前的表达式返回的是DataFrame数据,[]方法修改的是这个数据的值,而不是原有的muban

我们通过下面的演示让大家熟悉了解一下:

import pandas as pd

d = {'col1': ['才哥''财哥'], 'col2': [10199]}
df = pd.DataFrame(data=d)
df

案例数据:


col1col2
0才哥101
1财哥99

我们将col1才哥的这行数据的col2改为100

temp = df[df['col1']=='才哥']
temp['col2'] = 100

输出结果:


col1col2
0才哥100

而实际上df的值没变化

那么,怎么在df上进行修改呢?直接把[]里的值放在里面就行了~

df.loc[df['col1']=='才哥''col2'] = 100
df

输出结果:


col1col2
0才哥100
1财哥99

搞定!

以上就是最近在咱们技术交流群里朋友圈讨论的一些问题,相信大家还有更多解法,我这里也只是抛砖引玉。

如果你有兴趣,可以添加小编好友,加群一起交流沟通哈,非常欢迎~


阅读更多


粉丝破万,和你一起聊一聊学习与公众号写作的一些事儿~

2021-11-12

北京2021年的第一场冬雪,比以往时候来的更早一些!用Python采集历史天气数据,带你赏一赏~

2021-11-07

一看就会的Pandas文本数据处理

2021-08-08

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存